/*
 * Created on May 19, 2008
 *
 * Copyright (c) 2008, the JUNG Project and the Regents of the University 
 * of California
 * All rights reserved.
 *
 * This software is open-source under the BSD license; see either
 * "license.txt" or
 * http://jung.sourceforge.net/license.txt for a description.
 */
package edu.uci.ics.jung.algorithms.filters;

import org.apache.commons.collections15.Predicate;

import edu.uci.ics.jung.graph.Graph;

/**
 * Transforms the input graph into one which contains only those edges that pass
 * the specified <code>Predicate</code>. The filtered graph is a copy of the
 * original graph (same type, uses the same vertex and edge objects). All
 * vertices from the original graph are copied into the new graph (even if they
 * are not incident to any edges in the new graph).
 * 
 * @author Joshua O'Madadhain
 */
public class EdgePredicateFilter<V, E> implements Filter<V, E> {
	protected Predicate<E> edge_pred;

	/**
	 * Creates an instance based on the specified edge <code>Predicate</code>.
	 * 
	 * @param edge_pred
	 *            the predicate that specifies which edges to add to the
	 *            filtered graph
	 */
	public EdgePredicateFilter(Predicate<E> edge_pred) {
		this.edge_pred = edge_pred;
	}

	@Override
	public Graph<V, E> transform(Graph<V, E> g) {
		Graph<V, E> filtered;
		try {
			filtered = g.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(
					"Unable to create copy of existing graph: ", e);
		}

		for (V v : g.getVertices()) {
			filtered.addVertex(v);
		}

		for (E e : g.getEdges()) {
			if (edge_pred.evaluate(e)) {
				filtered.addEdge(e, g.getIncidentVertices(e));
			}
		}

		return filtered;
	}

}
